draw广告
简介
draw广告分为自渲染广告和模板广告,类型取决于三方SDK的支持情况。SDK 提供draw广告的数据绑定、点击事件的上报。
①自渲染广告:聚合SDK返回物料,由开发者在返回的CloooudMCanvasView类型的canvasView上进行子视图的自行渲染和展示。
②模板广告:聚合SDK直接返回渲染好的广告CloooudMCanvasView,开发者直接展示即可。
注意事项 ①需要确保在SDK初始化成功后再进行广告请求,否则可能导致广告请求加载失败。
②聚合维度广告是通过广告位ID发起广告请求的,切记不要使用混淆。
③在广告接入前需要明确各ADN对应聚合广告样式情况,以确保正确完成广告接入,避免由于广告类型不匹配导致接入报错等情况的发生。
④广告加载数量以平台配置数量为准,本地数量仅在平台配置为0时有效,目前本地配置支持的广告数量为 1 ~ 3。
⑤由于各广告平台对于包名校验规则不同,需确保在媒体平台填写的包名符合各adn平台规范,避免由于包名校验不匹配导致的无广告返回情况的产生。
⑥一定要设置rootViewController,即跳转落地页需要的viewController。
接入draw广告
// 创建广告对象
- (void)p_buildAd {
CloooudAdSlot *adSlot = [[CloooudAdSlot alloc]init];
adSlot.ID = self.viewModel.slotID; // 聚合维度通过广告位ID发起请求,
self.drawAdsManager = [[CloooudNativeAdsManager alloc]initWithSlot:adSlot];
self.drawAdsManager.delegate = self;
}
// 触发广告加载
- (void)p_loadAdData {
[self.drawAdsManager loadAdDataWithCount:3];
}
// 收到load成功回调后展示
# pragma mark ---<CloooudMNativeAdsManagerDelegate>---
- (void)nativeAdsManagerSuccessToLoad:(CloooudNativeAdsManager *)adsManager nativeAds:(NSArray<CloooudNativeAd *> *_Nullable)nativeAdDataArray{
/// 注意,demo仅处理了首个广告
CloooudNativeAd *model = nativeAdDataArray.firstObject;
model.rootViewController = self;
model.delegate = self;
model.mediation.videoDelegate = self;
CGFloat screenWidth = CGRectGetWidth(self.view.frame);
CGFloat screenHeight = CGRectGetHeight(self.view.frame);
CGFloat height = screenHeight - (CGRectGetMaxY(self.showAndRefreshAd.frame) + 20) - 100;
CGFloat width = screenWidth * height / CGRectGetHeight(self.view.frame);
CGFloat x = (screenWidth - width ) / 2;
if (model.mediation.isExpressAd) {
model.mediation.canvasView.frame = CGRectMake(x, CGRectGetMaxY(self.showAndRefreshAd.frame) + 20, width, height);
[self.view addSubview:model.mediation.canvasView];
[model.mediation render];
} else {
[_drawAdBackView removeFromSuperview];
_drawAdBackView = [[CloooudMDDrawVideoAdView alloc] initWithFrame:CGRectMake(x, CGRectGetMaxY(self.showAndRefreshAd.frame) + 20, width, height)];
_drawAdBackView.backgroundColor = [UIColor grayColor];
__weak typeof(self) weakself = self;
self.drawAdBackView.cellClose = ^(NSInteger index) {
__strong typeof(self) strongself = weakself;
[strongself.drawAdBackView removeFromSuperview];
};
[_drawAdBackView refreshUIWithModel:model];
_drawAdBackView.drawAdView.mediation.videoDelegate = self;
[self.view addSubview:_drawAdBackView];
}
}
获取展示后广告信息示例
在收到加载成功回调后访问可获取到正确信息
- (void)logAdInfoAfterShow {
CloooudMRitInfo *info = [self.drawAdsManager.mediation getShowEcpmInfo];
// 展示后可获取信息如下
NSLog(@"ecpm:%@", info.ecpm); // 单位:分
NSLog(@"platform:%@", info.adnName);
NSLog(@"ritID:%@", info.slotID);
NSLog(@"requestID:%@", info.requestID ?: @"None");
NSLog(@"getAdLoadInfoList:%@", [self.drawAdsManager.mediation getAdLoadInfoList]);
}
接口及回调说明
CloooudNativeAdsManager说明
方法 | 说明 |
---|---|
@property (nonatomic, strong, nullable) CloooudAdSlot *adslot; | 广告配置对象 |
@property (nonatomic, strong, nullable) NSArray<CloooudNativeAd > data; | |
@property (nonatomic, weak, nullable) id |
CloooudNativeAdsManagerDelegate,聚合维度使用CloooudMNativeAdsManagerDelegate |
@property (nonatomic, weak, nullable) id |
CloooudNativeExpressAdViewDelegate |
@property (nonatomic, assign, readwrite) CGSize adSize; | 广告尺寸 |
- (instancetype)initWithSlot:(CloooudAdSlot * _Nullable) slot; | 创建广告对象 |
- (void)loadAdDataWithCount:(NSInteger)count; | 加载广告数量 |
@property (nonatomic, strong, nullable, readonly) CloooudNativeAdsManagerMediation *mediation; | 当使用聚合广告位时,存在该属性,可获取聚合维度相关功能 |
CloooudNativeAdsManagerMediationProtocol说明
方法 | 说明 |
---|---|
@property (nonatomic, weak) UIViewController *rootViewController; | 必要,设置广告详情跳转控制器 |
- (void)destory; | 不再使用加载成功后回调的视图对象组时,可调用该方法释放占用的内存 |
@property (nonatomic, assign, readonly) BOOL isLoading; | 广告是否加载中 |
- (void)addParam:(id)param withKey:(NSString *)key; | 添加参数 param 参数值 key 参数key |
- (NSArray<CloooudMAdLoadInfo > )getAdLoadInfoList; | 一次waterfall中各adn代码位加载广告失败原因,建议调用时机:展示广告时/超时时/全部返回报错时;返回nil表示一次加载无代码位加载失败或其加载无响应 |
CloooudNativeAdsManagerDelegate说明
方法 | 说明 |
---|---|
- (void)nativeAdsManagerSuccessToLoad:(CloooudNativeAdsManager )adsManager nativeAds:(NSArray<CloooudNativeAd > *_Nullable)nativeAdDataArray; | 加载成功 |
- (void)nativeAdsManager:(CloooudNativeAdsManager )adsManager didFailWithError:(NSError _Nullable)error; | 加载失败 |
CloooudNativeAd说明
CloooudNativeAd为请求原生广告返回的广告类,可直接将CloooudMCanvasView添加到父视图上进行展示,目前仅支持frame布局方式,不支持自动布局。
| 方法 | 说明 |
| --- | --- |
|@property (nonatomic, weak, readwrite, nullable) id
CloooudNativeAdMediationProtocol说明
方法 | 说明 |
---|---|
@property (nonatomic, assign, readonly) BOOL isExpressAd; | 是否是模板广告,由adapter开发者实现 |
@property (nonatomic, strong, readonly, nonnull)CloooudMCanvasView *canvasView; | 如果是模板广告可直接将该视图添加到需要展示的位置,如果是非模板广告可对该视图内部控件进行布局操作 |
@property (nonatomic, weak, readwrite, nullable) id |
视频播放代理协议对象 |
@property (nonatomic, weak, readwrite, nullable) id |
聚合混出模板广告时,模板广告代理协议对象 |
@property (nonatomic, strong, readonly) CloooudMVideoAdReporter *videoAdReporter; | 自渲染视频类广告事件上报对象,仅采用自定义视频播放器时需要上报,部分ADN需申请白名单 |
- (void)render; | [必要]渲染模板广告,开发者调用前无需区分是否为模板广告,Cloooud会自行处理 |
- (void)reSizeMediaView; | 更新模板媒体视图大小 |
@property (nonatomic, assign, readonly) BOOL isReady; | 是否已经准备广告展示,理论上在广告加载回调后即为YES,但受一些因素的影响(例如广告失效),可能为NO。建议在广告展示前调用该方法进行是否可以展示 |
- (nullable CloooudMRitInfo *)getShowEcpmInfo; | 返回显示广告对应的披露信息 |
- (CloooudDictionary *_Nullable)extraData; | 广告的扩展信息,可能为nil |
- (NSArray<CloooudMRitInfo > )multiBiddingEcpmInfos; | 填充后可调用,但推荐展示后调用,返回竞价广告的ecpm;当为server bidding ad时访问需要白名单权限; |
- (NSArray<CloooudMRitInfo > )cacheRitList; | 填充后可调用, 返回广告缓存池内所有信息;nil为无权限 |
- (CloooudMRitInfo *)getCurrentBestEcpmInfo; | 填充后可调用,返回当前最佳广告的ecpm;当为server bidding ad时访问需要白名单权限 |
@property (nonatomic, copy, readonly) NSString *adViewID; | 广告视图的唯一标识 |
CloooudMaterialMeta说明
自渲染广告物料信息
方法 | 说明 |
---|---|
@property (nonatomic, assign) CloooudInteractionType interactionType; | 交互类型 |
@property (nonatomic, strong) NSArray<CloooudImage > imageAry; | 图片数组 |
@property (nonatomic, strong) CloooudImage *icon; | logo图标 |
@property (nonatomic, copy) NSString *AdTitle; | 广告标题 |
@property (nonatomic, copy) NSString *AdDescription; | 广告描述 |
@property (nonatomic, copy) NSString *source; | 广告源 |
@property (nonatomic, copy) NSString *buttonText; | 创意区域按钮文本 |
@property (nonatomic, assign) CloooudFeedADMode imageMode; | 广告样式 |
@property (nonatomic, assign) NSInteger score; | 评分 |
@property (nonatomic, assign) NSInteger commentNum; | 评论数 |
@property (nonatomic, assign) NSInteger appSize; | app大小 |
@property (nonatomic, assign) NSInteger videoDuration; | 视频时长 |
@property (nonatomic, copy, readonly) NSString *videoUrl; | 视频url |
@property (nonatomic, assign, readonly) BOOL allowCustomVideoPlayer; | 自定义播放器 |
@property (nonatomic, assign, readonly) NSInteger videoResolutionWidth; | 视频分辨率宽度 聚合维度不支持此场景 |
@property (nonatomic, assign, readonly) NSInteger videoResolutionHeight; | 视频分辨率高度 聚合维度不支持此场景 |
@property (nonatomic, copy) NSArray<CloooudDislikeWords > filterWords; | dislike原因 |
@property (nonatomic, copy) NSDictionary *mediaExt; | 配置参数 |
@property (nonatomic, copy) NSString *ADXName; | adx名称 |
@property (nonatomic, strong) CloooudAdGroupInfo groupInfo; - (instancetype)initWithDictionary:(NSDictionary )dict error:(NSError __autoreleasing )error; | 聚合维度不支持此场景 |
@property (nonatomic, strong, nullable, readonly) CloooudMaterialMetaMediation *mediation; | 当使用聚合广告位时,存在该属性,可获取聚合维度相关功能 |
CloooudMaterialMetaMediationProtocol说明
方法 | 说明 |
---|---|
@property (nonatomic, strong, readonly, nullable) CloooudImage *adLogo; | 广告adn的logo,如果logo有宽高,请尽量配置width和height |
@property (nonatomic, assign, readonly) CGFloat videoAspectRatio; | 视频纵横比(width/height),如果没有值或者异常返回0 |
@property (nonatomic, strong, readonly, nullable) NSString *appPrice; | app购买价格,例如'免费',没有则为nil |
@property (nonatomic, copy, readonly, nullable) NSString *advertiser; | 广告商标识,广告商的名称或者链接 |
@property (copy, nonatomic, readonly, nullable) NSString *brandName; | 品牌名称,若广告返回中无品牌名称则为空 |
CloooudMCanvasView说明
控件信息
方法 | 说明 |
---|---|
@property (nonatomic, strong, readonly, nullable) CloooudMaterialMeta *data; | 非模板Native广告的物料数据,模板广告时为nil |
@property (nonatomic, assign, readonly) BOOL hasSupportActionBtn; | 是否支持自定义事件按钮,如果为YES,开发者可以配置 callToActionBtn 的UI数值,默认为YES |
@property (nonatomic, strong, readonly, nonnull) UILabel *titleLabel; | 广告标题,需要开发者根据广告物料自己指定展示内容 |
@property (nonatomic, strong, readonly, nonnull) UILabel *descLabel; | 广告描述,需要开发者根据广告物料自己指定展示内容 |
@property (nonatomic, strong, nullable) UIImageView *iconImageView; | 广告图标,可能不存在,需要开发者根据广告物料自己指定展示内容 |
@property (nonatomic, strong, readonly, nonnull) UIImageView *imageView; | 广告大图,需要开发者根据广告物料自己指定展示内容,系统会自动创建,但内容需开发者自行校验 |
@property (nonatomic, strong, readonly, nonnull) UIButton *callToActionBtn; | 广告详情/下载按钮,可能不存在,文案内容需要开发者根据广告物料自己获取 |
@property (nonatomic, strong, nullable) UIView *advertiserView; | 广告商视图,可能不存在,开发者可自行赋值处理 |
@property (nonatomic, strong, nullable) UIButton *dislikeBtn; | 广告关闭按钮,可能不存在,开发者需自行处理响应事件 |
@property (nonatomic, strong, nullable) UIView *adLogoView; | 广告LOGO视图,可能不存在,需要开发者根据广告物料自己指定展示内容 |
@property (nonatomic, strong, readonly, nullable) UIView *mediaView; | 媒体视图,即视频广告的视频图层,非视频广告不存在该视图 |
- (void)registerClickableViews:(nullable NSArray<UIView > )views; | 注册可点击区域,由Cloooud透传数据,是否生效由adapter 和 adn 决定 views 可响应点击操作的视图 |
CloooudNativeAdDelegate说明
方法 | 说明 |
---|---|
- (void)nativeAdDidLoad:(CloooudNativeAd *)nativeAd; | 加载成功 |
- (void)nativeAdDidLoad:(CloooudNativeAd )nativeAd view:(UIView _Nullable)view; | 加载成功 推荐使用 |
- (void)nativeAd:(CloooudNativeAd )nativeAd didFailWithError:(NSError _Nullable)error; | 加载失败 |
- (void)nativeAdDidBecomeVisible:(CloooudNativeAd *)nativeAd; | 广告展示 |
- (void)nativeAdDidCloseOtherController:(CloooudNativeAd *)nativeAd interactionType:(CloooudInteractionType)interactionType; | 此方法在另一个控制器关闭时调用。 interactionType:在app中打开appstore或打开网页或查看视频广告详情页面。 |
- (void)nativeAdDidClick:(CloooudNativeAd )nativeAd withView:(UIView _Nullable)view; | 广告点击 |
- (void)nativeAd:(CloooudNativeAd _Nullable)nativeAd dislikeWithReason:(NSArray<CloooudDislikeWords > *_Nullable)filterWords; | dislike原因 |
@protocol CloooudMNativeAdDelegate |
CloooudMNativeAdDelegate |
- (void)nativeAdWillPresentFullScreenModal:(CloooudNativeAd *_Nonnull)nativeAd; | 广告即将展示全屏页面/商店时触发 nativeAd 广告视图 |
CloooudMNativeAdExpressDelegate说明
方法 | 说明 |
---|---|
- (void)nativeAdExpressViewRenderSuccess:(CloooudNativeAd *_Nonnull)nativeAd; | 渲染成功 |
- (void)nativeAdExpressViewRenderFail:(CloooudNativeAd _Nonnull)nativeAd error:(NSError _Nullable)error; | 渲染失败 |
- (void)nativeAdExpressViewDidBecomeVisible:(CloooudNativeAd *_Nonnull)nativeAd; | 广告展示 |
- (void)nativeAdExpressViewDidClick:(CloooudNativeAd _Nonnull)nativeAd withView:(UIView _Nullable)view; | 广告点击 |
- (void)nativeAdExpressViewWillPresentFullScreenModal:(CloooudNativeAd *_Nonnull)nativeAd; | 广告即将展示全屏页面/商店时触发 |
- (void)nativeAdExpressView:(CloooudNativeAd _Nullable)nativeAd dislikeWithReason:(NSArray<CloooudDislikeWords > *_Nullable)filterWords; | 模板广告点击关闭时触发 nativeAd 广告视图 filterWords 广告关闭原因,adapter开发者透传数据 |
- (void)nativeAdExpressViewDidDismissFullScreenModal:(CloooudNativeAd *_Nonnull)nativeAd; | 广告即将退出全屏页面/商店时触发 |
CloooudMNativeAdVideoDelegate说明
方法 | 说明 |
---|---|
- (void)nativeAdVideo:(CloooudNativeAd *_Nullable)nativeAd stateDidChanged:(CloooudPlayerPlayState)playerState; | 当视频播放状态改变之后触发 nativeAd 广告视图 playerState 变更后的播放状态 |
- (void)nativeAdVideoDidClick:(CloooudNativeAd *_Nullable)nativeAd; | 广告视图中视频视图被点击时触发 nativeAd 广告视图 |
- (void)nativeAdVideoDidPlayFinish:(CloooudNativeAd *_Nullable)nativeAd; | 广告视图中视频播放完成时触发 nativeAd 广告视图 |
完整接入示例
- (void)loadDrawAd {
if (self.drawAdsManager) {
// 销毁上次广告对象
[self.drawAdsManager.mediation destory];
}
CloooudAdSlot *slot = [[CloooudAdSlot alloc] init];
slot.ID = @"广告位ID"; // 聚合维度通过广告位ID发起请求,
slot.adSize = CGSizeMake(375, 150); // 尺寸根据实际情况设置
slot.mediation.mutedIfCan = YES; // 静音 聚合功能
CloooudNativeAdsManager *drawAdsManager = [[CloooudNativeAdsManager alloc] initWithSlot:slot];
drawAdsManager.mediation.rootViewController = self;
drawAdsManager.delegate = self;
self.drawAdsManager = drawAdsManager;
[self.drawAdsManager loadAdDataWithCount:3]; //加载广告数量,支持1-3个
}
/******** draw信息流广告加载回调处理 *********/
# pragma mark CloooudMNativeAdsManagerDelegate
// 广告加载成功
- (void)nativeAdsManagerSuccessToLoad:(CloooudNativeAdsManager *)adsManager nativeAds:(NSArray<CloooudNativeAd *> *_Nullable)nativeAdDataArray {
for (CloooudNativeAd *model in nativeAdDataArray) {
model.rootViewController = self;
model.delegate = self;
if (model.mediation.isExpressAd) {
[model.mediation render];
} else {
// 开发者需自行渲染广告,渲染到model.mediation.canvasView上
// 可以通过model.data.imageMode判断广告样式(大图/视频/组图...)
// 可以通过model.data.imageAry获取图片数据
// 可以通过model.data.AdTitle获取广告标题
// 详情请查看接入文档
[self customRenderAd:model];
}
/* (注意: getShowEcpmInfo 只需要在当前 adView show 之后调用, show 之前调用该方法会返回 nil)
CloooudMRitInfo *info = [model.mediation getShowEcpmInfo];
NSLog(@"ecpm:%@", info.ecpm);
NSLog(@"platform:%@", info.adnName);
NSLog(@"ritID:%@", info.slotID);
NSLog(@"requestID:%@", info.requestID ?: @"None");
*/
CloooudDictionary *mediaExt = model.mediation.extraData;
if (mediaExt) {
NSLog(@"coupon:%@", mediaExt[@"coupon"]);
NSLog(@"live_room:%@", mediaExt[@"live_room"]);
NSLog(@"product:%@", mediaExt[@"product"]);
}
// 展示广告
if (model.mediation.canvasView) {
[self.view addSubview:model.mediation.canvasView];
}
}
}
// 广告加载失败
- (void)nativeAdsManager:(CloooudNativeAdsManager *)adsManager didFailWithError:(NSError *_Nullable)error {
}
详细示例请参见Demo。